import java.util.HashMap;
import java.util.Map;

/**
 * 享元模式（Flyweight Pattern）是一种结构型设计模式，其核心思想在于通过共享的方式来高效地支持大量细粒度对象的复用。
 * 该模式通过尽量减少对象的创建，达到节省内存和提高性能的目的。在享元模式中，只有那些可以共享的状态被存储在享元对象中，
 * 而那些不可共享的状态则由客户端传入享元对象，以此来区分不同的享元实例。
 * 通俗理解：可以把享元当做常亮量，减少重复创建
 */
public class Main {
    /**
     * 说白了就是对已有对象的复用
     * 就不整什么花里胡哨的，直接用一个简单例子举例
     */
    public static void main(String[] args) {
        Main main = new Main();
        Map<Integer, Object> fail = main.getResult(false, null);
        Map<Integer, Object> fail1 = main.getResult(false, null);
        System.out.println(fail1 == fail); // true
        Map<Integer, Object> successData = main.getResult(true, "data");
        Map<Integer, Object> success = main.getResult(true, null);
        System.out.println(successData == success);

    }

    private static final Map<Integer, Object> success = new HashMap<>(1) {{
        put(200, "success");
    }};

    private static final Map<Integer, Object> fail = new HashMap<>(1) {{
        put(200, "fail");
    }};

    /**
     * 现在有个接口，成功返回 { 200: "success" }
     * 如果有内容，则返回 { 200: {object} }
     * 如果失败则固定返回 { 500 : "fail" }
     */
    public Map<Integer, Object> getResult(boolean success, Object data) {
        // 我这里省去了创建对象的步骤，重点在于已有对象的复用
        // 这样就不用每次都对结果集进行封装，节省内存空间
        if (!success) {
            // 失败则返回固定对象 fail Map
            return Main.fail;
        }
        if (null != data) {
            // 如果没有模板则自己创建一个新的
            return new HashMap<>(1) {{
                put(200, data);
            }};
        }
        return Main.success;
    }
}